/*****************************
 *  -----------------------  *
 * DRobot (Take the Control) *
 *  -----------------------  *
 *****************************/
package com.drobot.screen;

import java.awt.Color;
import java.awt.image.BufferedImage;

/**
 * 
 * Objeto que representa un pixel en pantalla, compuesto por:
 * <ul>
 * <li>La coordenada <b>x</b> del pixel, medida desde el extremo izquierdo de la pantalla.</li>
 * <li>La coordenada <b>y</b> del pixel, medida desde el extremo superior de la pantalla.</li>
 * <li>El <b>color</b> del pixel.</li>
 * </ul>
 * 
 * @author Juan Horno
 * 
 */
public class Pixel {
	public int x;
	public int y;
	public Color color;

	public Pixel() {
		this(0, 0, Color.BLACK);
	}

	public Pixel(int x, int y) {
		this(x, y, Color.BLACK);
	}

	public Pixel(int x, int y, int color) {
		this(x, y, new Color(color));
	}

	public Pixel(int x, int y, String color) {
		this(x, y, new Color(Integer.parseInt(color.replace("0x", ""), 16) + 0xFF000000));
	}

	public Pixel(int x, int y, BufferedImage image) {
		this(x, y, new Color(image.getRGB(x, y)));
	}

	public Pixel(Pixel pixel) {
		this(pixel.x, pixel.y, pixel.color);
	}

	public Pixel(int x, int y, Color color) {
		set(x, y, color);
	}

	public void set(int x, int y, Color color) {
		this.x = x;
		this.y = y;
		this.color = color;
	}

	public String getHexColor() {
		return String.format("0x%06X", (0xFFFFFF & color.getRGB()));
	}

	/**
	 * Compara el color de dos pixeles, devolviendo <b>true</b> si tienen exactamente el mismo color.
	 * 
	 * @param obj
	 *            El pixel o color con el que se quiere comparar.
	 * 
	 * */
	public boolean equals(Object obj) {
		return equals(obj, 0);
	}

	/**
	 * Compara el color de dos pixeles, devolviendo <b>true</b> si la diferencia entre cada uno de los colores basicos
	 * RGB que componen cada pixel, no supera el valor delta.
	 * 
	 * @param obj
	 *            El pixel o color con el que se quiere comparar.
	 * @param delta
	 *            La desviacion maxima permitida <i>(0-255)</i>.
	 * 
	 * */
	public boolean equals(Object obj, int delta) {
		Color otherColor = null;
		if (obj instanceof Pixel){
			otherColor = ((Pixel) obj).color;
		}else if (obj instanceof Color){
			otherColor = ((Color) obj);
		}else if (obj instanceof String){
			otherColor = new Color(Integer.parseInt(((String) obj).replace("0x", ""), 16) + 0xFF000000);
		}
		if (Math.abs(otherColor.getRed() - color.getRed()) <= delta
				&& Math.abs(otherColor.getBlue() - color.getBlue()) <= delta
				&& Math.abs(otherColor.getGreen() - color.getGreen()) <= delta) {
			return true;
		}
		return false;
	}

	@Override
	public String toString() {
		return ("P[" + x + "," + y + "," + getHexColor() + "]");
	}

}
